/* 
 * File:   Template.h
 * Author: H4314
 *
 * Created on 24 avril 2012, 08:11
 */

#ifndef TEMPLATE_H
#define	TEMPLATE_H

#include <iostream>
#include <string>
#include <list>
#include <sstream>

#include "../xml/Element.h"
#include "../xml/Content.h"
#include "../xml/Attribute.h"

#define ATTR_MATCH      "match"
#define APPLY_TEMPLATES "apply-templates"
#define VALUE_OF        "value-of"
#define NS_XSL          "xsl"

using namespace std;

class Template {
public:
    Template(Element * templateElement);
    
    //toClean garde en mémoire les noeuds <template> pour le détruire proprement
    virtual ~Template();
    
    const string & getElementMatchedName() const;
    
    // Retourne la liste des templates customizés destiné à l'affichage
    // Alias de "Apply(contentToDraw)"
    list<Node *> Draw();

    // Applique le template à la liste de noeuds
    // Apply se charge de couper la racine <template> et de renvoyer
    // ses branches (enfants)
    list<Node *> Apply(const list<Node *> & nodesToInsert);
    
private:
    Element * templateElement;
    string elementMatchedName;
    list<Node *> toClean;
    Content * contentToDraw;// Noeud contenant le terme matché destiné à draw

    // Insère la liste de noeud à la place de APPLY_TEMPLATES ou VALUE_OF (récursif)
    // insertNode renvoie un sous arbre de racine <template>
    Node * insertNode(Node * node, const list<Node *> & elementsToInsert);
};

#endif	/* TEMPLATE_H */

